package pl.prv.polanie.client.widgets.schedule;

import pl.prv.polanie.client.dto.CSSubjectEventDTO;

import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Widget;

public class ScheduleUtil {

	
	public static int convertFromStartTimeToPixels(int startTime, boolean fullTimeSchedule) {
		float factor = (fullTimeSchedule?1:0.5f);
		return (int)((startTime - 420) / (60f) * 36 * factor); 
	}
	
	public static int convertFromDurationToPixels(int duration, boolean fullTimeSchedule) {
		float factor = (fullTimeSchedule?1:0.5f);
		return (int)((float)duration / 60f * 36 * factor); 
	}
	
	public static int convertFromPixelsToStartTime(int pixels, boolean fullTimeSchedule) {
		float factor = (fullTimeSchedule?1:0.5f);
		return (int)(pixels / factor * 60f / 36 + 420);
	}
	
	public static int convertFromPixelsToDuration(int pixels, boolean fullTimeSchedule) {
		float factor = (fullTimeSchedule?1:0.5f);
		return (int)(pixels / factor * 60f / 36);
	}
	
	
	
	public static boolean eventOverWiget (final Widget w, Event e) {
		
		//wspolrzedne eventa wobec lewego gornego rogu kontrolki w
		int x = getEventXOverWidget(w, e);
		int y = getEventYOverWidget(w, e);
		 
		if (
				x > w.getOffsetWidth() ||
				x < 0 ||
				y > w.getOffsetHeight() ||
				y < 0
			) {
			return false;
		}
		return true;
	}
	

	/**
	 * Podaje wsdpolrzedna x eventa, ktory pojawil sie, wobec podanej kontrolki.
	 * @param w
	 * @param e
	 * @return
	 */
	public static int getEventXOverWidget(Widget w, Event e) {
		int x = DOM.eventGetClientX(e)
		- DOM.getAbsoluteLeft(w.getElement())
		+ DOM.getElementPropertyInt(w.getElement(), "scrollLeft")
		+ Window.getScrollLeft();
		return x;
	}
	
	public static int getEventYOverWidget(Widget w, Event e) {
		int y = DOM.eventGetClientY(e)
		- DOM.getAbsoluteTop(w.getElement())
		+ DOM.getElementPropertyInt(w.getElement(), "scrollTop")
		+ Window.getScrollTop();
		return y;
	}
	
	
	/**
	 * Sprawdza czy dwa CSSubjectEventy sie ze soba zazebiaja, jesli chodzi o startTime i duration.
	 * UWAGA!! Nie jest brany pod uwage atrybut calendarDay (wedle funkcji nie musza byc z tego samego dnia, zeby sie zazebiac).
	 * @param se1
	 * @param se2
	 * @return
	 */
	public static boolean crossed(CSSubjectEventDTO csSE1, CSSubjectEventDTO csSE2) {
		
		if (csSE1.getStartTime().intValue() >= csSE2.getStartTime().intValue() && csSE1.getStartTime().intValue() < csSE2.getStartTime().intValue() + 
				csSE2.getDuration().intValue()) {
			return true;
		}
		
		if (csSE2.getStartTime().intValue() >= csSE1.getStartTime().intValue() && csSE2.getStartTime().intValue() < csSE1.getStartTime().intValue() +
				csSE1.getDuration().intValue()) {
			return true;
		}
		
		return false;
	}

}
